package org.example.oop.thread;

import lombok.SneakyThrows;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * org.example.oop.thread
 *
 * @author moLei
 * @description 有一个抽奖池，池中奖项为{10，5，20，50，100，200，500，800，2，80，300，700}
 *              创建两个抽奖箱，名称为：抽奖箱1，抽奖箱2
 *              随机从奖池中获取元素并打印，格式如下：
 *                  抽奖箱1又产生了一个10元大奖
 *                  。。。。。。
 * @date 2025/6/25
 */
public class RaffleExercises {

    /**
     * 初始化奖项池
     */
    private static ArrayList<Integer> raffleList = new ArrayList<>(Arrays.asList(10,5,20,50,100,200,500,800,2,80,300,700));

    /**
     * 抽奖箱进行抽奖的逻辑
     */
    public synchronized static int getRaffle(ArrayList<Integer> raffleList) {
        if (raffleList.isEmpty()) {
            System.out.println("奖项池已空");
            return -1;
        }
        // 获取随机奖项
        int randomNum = ((int) (Math.random() * 10)) % raffleList.size();

        int raffle = raffleList.get(randomNum);

        // 获取奖项
        System.out.println(Thread.currentThread().getName() + "又产生了一个" + raffle + "元大奖");

        // 移除奖项
        raffleList.remove(randomNum);

        return raffle;
    }

    public static void main(String[] args) throws InterruptedException {
        ArrayList<Integer> copy = new ArrayList<>(raffleList);

        // 记录抽奖箱的中将记录
        List<Integer> raffle1 = new ArrayList<>();
        List<Integer> raffle2 = new ArrayList<>();

        Thread thread1;
        Thread thread2;

        for (int i = 0; i < 2; i++) {
            new Thread(new Runnable() {
                @Override
                @SneakyThrows
                public void run() {
                    while (!copy.isEmpty()) {
                        Thread.sleep(10);
                        int raffle = getRaffle(copy);
                        if (raffle < 0) {
                            break;
                        }
                        if (Thread.currentThread().getName().contains("1")) {
                            raffle1.add(raffle);
                        } else {
                            raffle2.add(raffle);
                        }
                    }
                }
            }, "抽奖箱"+ (i + 1)).start();
        }

        Thread.sleep(3000);
        // 打印奖项
        System.out.println(String.format("在此次抽奖过程中，抽奖箱1总共产生了%d个奖项", raffle1.size()));
        // max方法的返回值是Optional<Integer>类型，不能直接当作%d的值，使用orElse方法给他处理一下
        System.out.println(String.format("分别为：%s，最高奖项为%d元，总计额为%d元", raffle1, raffle1.stream().max(Integer::compare).orElseThrow(RuntimeException::new), raffle1.stream().mapToInt(Integer::intValue).sum()));
        System.out.println(String.format("在此次抽奖过程中，抽奖箱2总共产生了%d个奖项", raffle2.size()));
        System.out.println(String.format("分别为：%s，最高奖项为%d元，总计额为%d元", raffle2, raffle2.stream().max(Integer::compare).orElseThrow(RuntimeException::new), raffle2.stream().mapToInt(Integer::intValue).sum()));


        // 获取最大的奖项
        Integer raff1 = raffle1.stream().max(Integer::compare).get();
        Integer raff2 = raffle2.stream().max(Integer::compare).get();

        // 进行比较
        System.out.println(String.format("在此次抽奖过程中，抽奖箱%s中产生了最大奖项，该奖项金额为%d元", raff1 > raff2 ? "1" : "2", raff1 > raff2 ? raff1 : raff2));

    }
}
